﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
using Persistencia_y_capa_de_negocio;

namespace webclonegame.FormulariosPrivada
{
    public partial class Formulario_Defensa : System.Web.UI.Page
    {
        protected ArrayList edificios;
        public Timer tm;
        protected bool modificable;
        public int editando;
        ENUsuario usuario;

        protected void Page_Load(object sender, EventArgs e)
        {
            // Inicializamos a -1 pero luego le pondremos el valor del que realmente es.
            //editando = -1;
            usuario = (ENUsuario)Session["UsuarioActual"];

            CADEdificioUsuario.Instancia.obtenerEdificiosUsuario(usuario.IDUsuario);

            editando = (int)Session["defEdit"];

            Timer1.ID = "Timer1";
            Timer1.Interval = 10000;
            Timer1.Tick += new EventHandler<System.EventArgs>(this.Timer1_Tick);

            //Timer1.Enabled = false;
            //Page.Controls.Add(tm);
            //ScriptManager sm = ScriptManager.GetCurrent(this.Page);

            // Variable que indica si podemos intentar construir cuando hay algo construyéndose.
            modificable = true;
            CargaDatos();

            // Una vez cargados los datos comprobamos qué posibles eventos se están realizando ahora mismo.
            // Si hay eventos pendientes tendrán que solucionarse.
            //CADEvento.Instancia.GestionaCaducados();

            // Una vez hemos gestionado los eventos caducados, miramos si tenemos un evento del tipo actual.

            ENEvento ev = CADEvento.Instancia.getEventoUsuarioDefensa(usuario.IDUsuario);

            if (ev.Id != -1)
            {
                // Al ser distinto de -1 significa que hay un evento que está ahora mismo pendiente.

                // Ahora desactivo todos los botones para que no haya cosas raras.

                DataListItemCollection controles = dlDefensa.Items;

                foreach (Control c in controles)
                {
                    Button b = (Button)c.FindControl("btMejorar");
                    b.Enabled = false;
                }

                // Buscamos qué edificio es el que tenemos que editar.
                foreach (ENEdificio ed in edificios)
                {
                    if (ed.Id == ev.IdObjeto)
                    {
                        lbEditando.Text = ed.Nombre;
                        int tiempo = (int)(ev.FechaFin - DateTime.Now).TotalSeconds;
                        lbTiempo.Text = tiempo.ToString();
                        RegisterStartupScript("cuenta", "<script language=\"JavaScript\">countdown()</script>");
                        if (tiempo > 0)
                        {
                            Timer1.Interval = tiempo * 1000;
                            Timer1.Interval += 1000;
                        }
                        else
                        {
                            Timer1.Interval = 1000;
                        }
                        Timer1.Enabled = true;


                        // Ahora encuentro cual de toda la lista es el que debo actualizar.
                        bool encontrado = false;
                        int i = 0;


                        foreach (Control c in controles)
                        {
                            Label b = (Label)c.FindControl("lbNombreDefensa");
                            if (b.Text == ed.Nombre)
                            {
                                Session["defEdit"] = i;
                            }
                            i++;
                        }
                    }
                }

                
            }
        }

        protected void CargaDatos()
        {
            try
            {
                edificios = CADEdificio.Instancia.getEdificiosTipo(2);
                ArrayList nombres = new ArrayList();

                foreach (ENEdificio ed in edificios)
                {
                    nombres.Add(ed.Nombre);
                }

                // Tenemos la lista de nombres de los edificios.

                dlDefensa.DataSource = nombres;
                dlDefensa.DataBind();
            }
            catch
            {

            }
                
            
            // Ahora tendríamos que mirar los posibles eventos y ver cuanto tiempo falta para que se produzcan
        }

        protected void dlDefensa_ItemCreated(object sender, DataListItemEventArgs e)
        {
            // Al crear un elemento de la lista damos valores al resto de campos del datalist.

            try
            {
                // Usuario actual.
                ENUsuario usuario = (ENUsuario)Session["UsuarioActual"];

                // Edificio que estamos analizando ahora en el DataList
                ENEdificio ed = CADEdificio.Instancia.getEdificio(e.Item.DataItem.ToString());

                // Objeto para saber el nivel del edificio actual y poder calcular su tiempo
                EnEdificioUsuario edus = CADEdificioUsuario.Instancia.obtenerEdificioUsuario(usuario.IDUsuario, ed.Id);

                // Variable que nos dice cuanto se tardará en construir el siguiente edificio.
                int tiempo = ed.Tiempo * (edus.NivelEd + 1);

                // Label que contiene la descripción del edificio en el campo actual del dataList
                Label descripcion = (Label)e.Item.FindControl("lbDescripcion");
                descripcion.Text = ed.Descripcion;

                // Imagen del edificio actual
                Image im = (Image)e.Item.FindControl("imDefensa");
                im.ImageUrl = @"ImagenesPrivada/edificios/" + ed.Nombre + ".png";
                im.Height = 85;
                im.Width = 85;

                //UpdatePanel que actualizará los labels etc...
                UpdatePanel up = (UpdatePanel)e.Item.FindControl("UpdatePanel1");

                // Label con los segundos restantes para la creación del edificio (usado en javascript)
                Label lbTimer = (Label)e.Item.FindControl("Timer");

                // Label con el nivel siguiente.
                Label lbNivel = (Label)e.Item.FindControl("lbNivel");

                // Label con el nombre del edificio.
                Label lbNombreDefensa = (Label)e.Item.FindControl("lbNombreDefensa");

                lbTimer.Text = tiempo.ToString();
                lbTimer.ID = "Timer";

                lbNivel.Text = "Segundos para nivel: ";

                // ArrayList con todos los edificios que tiene el usuario, para saber si tiene el que queremos crear.
                ArrayList edificios = CADEdificioUsuario.Instancia.obtenerEdificiosUsuario(usuario.IDUsuario);

                // Una vez tenemos los edificios que posee el usuario, podremos ver, si el actual lo posee, para saber el nivel.
                bool encontrado = false;

                // Buscamos el edificio para poner el nivel
                foreach (EnEdificioUsuario edu in edificios)
                {
                    if (edu.IDEdificio == ed.Id)
                    {
                        lbNivel.Text += edu.NivelEd + 1;
                        encontrado = true;
                    }
                }

                // Si no lo encontramos, no lo tiene por lo tanto el nivel siguiente será el 1
                if (!encontrado)
                {
                    lbNivel.Text += 1;
                }

            }
            catch
            {

            }
        }

        /// <summary>
        /// Método que se dispara cuando el Timer ha terminado su cuenta atrás
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Timer1_Tick(object sender, EventArgs e)
        {
            // Label con el tiempo restante.
            Label lbTimer = (Label)dlDefensa.Items[(int)Session["defEdit"]].FindControl("Timer");
            lbTimer.Text = "Modificado";

            // Labels en el título que nos indicaban el edificio y el tiempo restante de la creación
            lbEditando.Text = "";
            lbTiempo.Text = "";

            // Desactivamos el timer para que no siga contando indefinidamente
            Timer1.Enabled = false;

            // Ponemos la variable de session defEdit a -1 para saber que no estamos editando ningún campo
            Session["defEdit"] = -1;
            editando = -1;

            // Activo de nuevo todos los botones para poder edificar otra vez.
            DataListItemCollection controles = dlDefensa.Items;

            foreach (Control c in controles)
            {
                Button b = (Button)c.FindControl("btMejorar");
                b.Enabled = true;
            }

            // Ya que ha pasado el tiempo gestionamos el evento que acaba de caducar.
            CADEvento.Instancia.GestionaCaducados();

            modificable = true;
            //((Timer)sender).Enabled = false;
        }

        protected void dlDefensa_Databinding(object sender, EventArgs e)
        {
            //Al tener el evento bind tengo que poner el nombre del label.            
        }
        protected void btMejorar_Click(object sender, EventArgs e)
        {
            // Botón para empezar la cuenta atrás.
            
            //Page.RegisterStartupScript("miscript", "alert('hola')");
            //Timer tm = (Timer) ((Button)sender).Parent.FindControl("Timer1");

            Label lbNombre = (Label)((Button)sender).Parent.FindControl("lbNombreDefensa");
            ENUsuario usuario = (ENUsuario)Session["UsuarioActual"];
            ENEdificio ed = CADEdificio.Instancia.getEdificio(lbNombre.Text);
            

            if (modificable == true && lbTiempo.Text == "")
            {
                
                
                ENEvento ev = new ENEvento();
                EnEdificioUsuario edu = CADEdificioUsuario.Instancia.obtenerEdificioUsuario(usuario.IDUsuario, ed.Id);

                int tiempo = ed.Tiempo * (edu.NivelEd + 1);

                ev.Cantidad = 0;
                ev.IdUsuario = usuario.IDUsuario;
                ev.IdObjeto = ed.Id;
                ev.Tipo = 2;
                ev.FechaFin = DateTime.Now.AddSeconds(tiempo);

                Timer1.Interval = tiempo * 1000;
                Timer1.Interval += 1000;
                Timer1.Enabled = true;

                CADEvento.Instancia.InsertarEvento(ev);

                bool encontrado = false;
                int i = 0;
                for (i = 0 ; i < edificios.Count && encontrado == false ; i++)
                {
                    // Busco que edificio quiero modificar.
                    if (((ENEdificio)edificios[i]).Nombre == lbNombre.Text)
                    {
                        Session["defEdit"] = i;
                        editando = i;
                        lbEditando.Text = lbNombre.Text;
                        lbTiempo.Text = tiempo.ToString();

                        encontrado = true;
                    }
                }
                //<asp:AsyncPostBackTrigger ControlID="btMejorar" EventName="Click"/>

                // Ahora desactivo todos los botones para que no haya cosas raras.

                DataListItemCollection controles = dlDefensa.Items;

                foreach (Control c in controles)
                {
                    Button b = (Button)c.FindControl("btMejorar");
                    b.Enabled = false;
                }

                modificable = false;
            }
            

            //UpdatePanel up = (UpdatePanel)dlDefensa.Items[0].FindControl("UpdatePanel1");
            
        }
    }
}
